﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Bewise.SmartIndexManager.Core.Classes.Options;
using Bewise.SmartIndexManager.Core.Classes.Types;
using Microsoft.SqlServer.Management.Smo;
using Bewise.SmartIndexManager.Core.Classes.Database;
using Microsoft.DataTransformationServices.Controls.ProviderInfos;
using Bewise.SmartIndexManager.Core.Classes.Instance;

namespace Bewise.SmartIndexManager.Core.Classes.IndexManager
{
    public static class GetEntities
    {
        // retourne les base de données associées au server ET aux base de données selectionnées par l'utilisateur
        public static List<Microsoft.SqlServer.Management.Smo.Database> GetDatabases(TaskInfosContainer taskInfosContainer, Server server)
        {
            DatabasesTypeEnum typeDatabase = taskInfosContainer.InstanceInfos.SelectedDatabases;
            List<DatabaseInfos> databasesInfos = taskInfosContainer.InstanceInfos.Databases;
            List<AbstractOption> options = taskInfosContainer.Options;

            var listDatabases = new List<Microsoft.SqlServer.Management.Smo.Database>();

            switch (typeDatabase)
            {
                case DatabasesTypeEnum.AllDatabase:
                    // retourne toutes les bases de données du server courant
                    listDatabases.AddRange(server.Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>());
                    break;
                case DatabasesTypeEnum.TheseDatabases:

                    // récupération de toutes les bases de données selectionnées par l'utilisateur
                    foreach (var databaseInfo in databasesInfos)
                    {
                        try
                        {
                            var database = server.Databases[databaseInfo.DatabaseName];
                            if (database != null)
                                listDatabases.Add(database);
                        }
                        catch (Exception)
                        {
                            // non bloquant
                        }
                    }
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
            return listDatabases;
        }
    }
}
